import pandas as pd
import numpy as np
import os

def main():
    try:
        # 定义文件路径
        base_dir = r'D:\ttt数据挖掘'
        excel_file_name = 'sample_data_file.xlsx'
        csv_file_name = 'sample_data_file.csv'
        
        excel_file_path = os.path.join(base_dir, excel_file_name)
        csv_file_path = os.path.join(base_dir, csv_file_name)

        # 检查文件是否存在
        if not os.path.exists(excel_file_path):
            raise FileNotFoundError(f"Excel文件不存在: {excel_file_path}")
        if os.path.exists(csv_file_path):
            os.remove(csv_file_path)  # 如果CSV文件已存在，先删除

        # 将Excel文件转换为CSV文件
        df = pd.read_excel(excel_file_path)
        df.to_csv(csv_file_path, index=False)
        print("Excel文件已成功转换为CSV文件。")

        # 读取CSV文件
        df_csv = pd.read_csv(csv_file_path)
        print("\nCSV文件内容预览:")
        print(df_csv.head())

        # 初始化一个空的DataFrame来存储所有数据
        df_all = pd.DataFrame()

        # 分块读取CSV文件
        chunk_size = 366  # 根据实际情况调整分块大小

        for chunk in pd.read_csv(csv_file_path, chunksize=chunk_size):
            # 假设数据中包含'trade_date'和'ts_code'列，根据条件筛选数据
            chunk = chunk[(chunk['trade_date'] >= '2023-01-01') & 
                          (chunk['trade_date'] <= '2023-12-31') & 
                          (chunk['ts_code'] == '001')]
            df_all = pd.concat([df_all, chunk], ignore_index=True)

        # 计算涨跌幅
        # 首先对DataFrame按照'trade_date'进行排序，确保数据顺序正确
        df_all = df_all.sort_values(by='trade_date')

        # 检查必要的列是否存在
        required_columns = ['trade_date', 'ts_code', 'closes']
        if not all(col in df_all.columns for col in required_columns):
            raise ValueError("CSV文件中缺少必要的列,请检查文件内容。")

        # 计算前一天的收盘价
        df_all['shifts_closes'] = df_all['closes'].shift(1)

        # 计算涨跌幅
        df_all['zd_closes'] = (df_all['closes'] - df_all['shifts_closes']) / df_all['shifts_closes']

        # 筛选出所有数值型列，并排除指定的列（如'id', 'ts_code', 'trade_date'等）
        numeric_cols = df_all.select_dtypes(include=[np.number]).columns.tolist()
        exclude_cols = ['id','ts_code', 'trade_date', 'shifts_closes']  # 根据实际情况调整排除的列
        feature_cols = [col for col in numeric_cols if col not in exclude_cols]

        # 输出处理后的数据预览
        print("\n处理后的数据预览:")
        print(df_all.head())

        # 输出筛选后的特征列
        print("\n筛选后的特征列:")
        print(feature_cols)

    except FileNotFoundError as e:
        print(f"错误: {e}")
    except KeyError as e:
        print(f"错误: CSV文件中缺少必要的列 - {e}")
    except Exception as e:
        print(f"未知错误: {e}")

if __name__ == "__main__":
    main()